#ifndef OMEGA_H
#define OMEGA_H

/*!
 * \file Omega.h
 * \brief Déclaration des méthodes sur Omega
 * \author CARBONNEL Jessie
 * \version 1.0
 * \date 23 février 2013
 */

#include "Outcome.h"
#include "Variable.h"
#include "Preference.h"

#include <vector>
#include <set>


/*!
 * \class Omega
 * \brief Classe sur un omega.
*/ 
class Omega{
private:

	std::vector<Variable> variables; /*!< Vecteur de variables*/
	std::set<int> omega; /*!< Vecteur index d'outcomes */
	
public:
	
	/*!
	 * \fn Omega()
	 * \brief Constructeur par défaut d'Omega.
	 * \return Renvoie un Omega par défaut.
	 */	
	Omega();
	
	/*!
	 * \fn Omega(vector<Variable>& v)
	 * \brief Constructeur paramétré d'Omega.
	 * \param v un vecteur de variables passé par référence.
	 * \return Renvoie un Omega paramétré par un vecteur de variables.
	 */	
	Omega(const std::vector<Variable>& v);
	
	/*!
	 * \fn ~Omega()
	 * \brief Destructeur d'Omega.
	 * \return Ne renvoie rien.
	 */	
	~Omega();
	
	/*!
	 * \fn vector<Variable> getVariables()
	 * \brief Permet d'obtenir le vecteur contenant l'ensemble des variables d'Omega.
	 * \return Renvoie un vecteur contenant l'ensemble des variables d'Omega.
	 */	
	std::vector<Variable> getVariables()const;
	
	/*!
	 * \fn list<Outcome>* getOmega()
	 * \brief Permet d'obtenir un pointeur vers l'ensemble d'Omega.
	 * \return Renvoie un pointeur vers l'ensemble d'Omega.
	 */	
	std::set<int>* getOmega();
	
	/*!
	 * \fn long int getSize()
	 * \brief Permet d'obtenir le nombre d'outcomes pouvant être générées à partir des variables.
	 * \return Renvoie le nombre d'Outcomes pouvant être générées à partir des Variables.
	 */	
	long int getSize()const;
	
	/*!
	 * \fn long int getActualSize()
	 * \brief Permet d'obtenir le nombre d'Outcomes présentes dans l'ensemble.
	 * \return Renvoie le nombre d'Outcomes présentes dans l'ensemble.
	 */	
	long int getActualSize()const;
	
	/*!
	 * \fn void eraseOutcome(Outcome o)
	 * \brief Permet d'enlever l'Outcome, passé en paramètre, de l'ensemble.
	 * \param o une instance de la classe Outcome.
	 * \return Ne renvoie rien.
	 */	
	void eraseOutcome(int o);	

	/*!
	 * \fn void generateIndex()
	 * \brief Permet de générer l'ensemble des Outcomes (sous forme de nombres) de Omega.
	 * \return Ne renvoie rien.
	 */	
	void generateIndex();
	
	/*!
	 * \fn void showIntension()
	 * \brief Permet d'afficher l'ensemble des variables.
	 * \return Ne renvoie rien.
	 */	
	void showIntension()const;
	
	/*!
	 * \fn void showExtension()
	 * \brief Permet d'afficher l'ensemble des Outcomes (A ne pas utiliser s'il y a beaucoup d'Outcome...).
	 * \return Ne renvoie rien.
	 */	
	void showExtension()const;
	
	/*!
	 * \fn void clear()
	 * \brief Permet d'effacer les Outcomes de l'ensemble.
	 * \return Ne renvoie rien.
	 */	
	void clear();

	/*!
	 * \fn Outcome generateOutcome(long int id)
	 * \brief Genere une outcome à partir de son numéro
	 * \param id le numero correspondant à une outcome.
	 * \return Une instance de la classe Outcome.
	 */	
	Outcome generateOutcome(long int)const;

	/*!
	 * \fn Outcome generateOutcome(long int id ,Outcome o)
	 * \brief Genere une outcome à partir de son numéro
	 * \param id le numero correspondant à une outcome.
	 * \param o l'outcome a renvoyer.
	 * \return Ne retourne rien.
	 */	
	void generateOutcome(long int, Outcome&)const;

	/*!
	 * \fn int getCeterisParibus(int o, Preference p, set<int> c)
	 * \brief Renvoie l'Outcome selon Ceteris Paribus.
	 * \param o le numero représentant l'Outcome.
	 * \param p la Preference.
	 * \param c la partie d'une contrainte dans laquelle on doit chercher.
	 * \return Retourne un entier représentant une Outcome.
	 */	
	int getCeterisParibus(int o, Preference p, std::set<int> c);
};

#endif
